《贪心算法》— NYOJ 1087 摆方格

      http://blog.csdn.net/u012349696/article/details/399266

                                                              摆  方格

 

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述

  给你一个n*n的方格,每个方格里的数必须连续摆放如  

 

,下图为不连续的,请输出从左上角到右下角的对角线上的最大和   

 

输入

输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)

输出

每行输出占一行,输出最大的对角线之和。

样例输入

123

样例输出

1619

上传者

ACM_刘炀

分析:n=1 1

n=2  1 2 斜对角线=2+4=6

4 3

n=3

18 9

27 6

3 4 5斜对角线=9 + 7+3

n=4 

9 10 15 16 斜对角线=16 + 14 +12+6 =48 规律 n*n+n*n-2+n*n-4+(n*n-4)/2;

8 11 14 1

7 12 13 2

6 5    4 3

公式法:

[cpp] view plain copy

  1. #include<stdio.h>  
  2. int main(){  
  3.     long long n,m,i,j;  
  4.     while(~scanf("%lld",&n))  
  5.     {  
  6.         long long k=n-1,M=n*n;  
  7.         printf("%l64d\n",k*M-k*(k-1)+n*n/2-n+2);  
  8.     }  
  9.     return 0;  
  10. }  

 

模拟过程法:

 

[cpp] view plain copy

  1. #include<iostream>    
  2. #include<string.h>    
  3. #include<algorithm>    
  4. #include<cstdio>    
  5. using namespace std;    
  6.     
  7. int main()    
  8. {    
  9.     long long n;    
  10.     while(cin>>n)    
  11.     {    
  12.         long long k=n*n;    
  13.         long long sum=0;    
  14.     
  15.         for(int i=0; i<n-1; i++)    
  16.         {    
  17.                 sum+=k;    
  18.                 k-=2;    
  19.         }    
  20.         k/=2;    
  21.         sum+=k;    
  22.         cout<<sum+1<<endl;    
  23.     
  24.     }    
  25.     return 0;    
  26. }    
       
    #include<iostream>  
    using namespace std;  
      
    int main()  
    {  
        long long n,m;  
        while(cin>>n)  
        {  
            long long k=n-1,M=n*n;  
            cout<<k*M-k*(k-1)+n*n/2-n+2<<endl;  
        }  
    }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值